CAN 总线与车载通信入门实战

📅 2026-09-04
#来源/立芯星球 #类型/专题提炼 #技术/CAN #技术/汽车电子 #技术/EtherCAT #技术/UDS

CAN 总线与车载通信入门实战

本专题由星球 07-通信协议与升级、08-汽车电子 两个板块中关于 CAN/车载通信的帖子提炼综合而成,不是原文转载,观点归属原帖作者。

一、为什么 CAN 依然是车载与机器人的"长期主力"

星球内多篇帖子从不同角度收敛到了同一个判断:CAN(含 CAN FD)在车身外设、电源管理与分布式状态网络中的地位短期内不可替代

刘子奇在机器人通信架构分析中指出,机器人整机通信必然走向"分层网络":运动控制层(0.25–1ms 周期)倾向 EtherCAT,而机身外设层(5–100ms 周期)用 CAN/CAN FD 更合适——因为这一层的优先级是鲁棒性 > 成本 > 诊断可维护性 > 带宽,而 CAN 家族成熟的错误计数、Bus-off 隔离机制恰好匹配。机器人通信EtherCAT与CAN(刘子奇)

CAN 的非破坏性仲裁(CSMA/CR)保证了高优先级报文不被破坏,但代价是高负载下低优先级报文时延上升。多帖共同给出的工程建议是:报文周期与优先级要联合设计,实际可用负载保留充足裕量,不要长期贴上限运行。至于"负载率多少算合适",有学员在轨道交通 CAN FD 项目中提问,答复引用 ISO 11898:基础协议只建议峰值负载 < 80%,这是协议标准而非玄学经验值。老师们 新年好 请教一个问题,can总线的负载率一般为百分之多少是一个比较能接受的值(Jack 转述)

二、CAN 节点设计的"车规级"要求

把 CAN 当成"一根导线"是新手最常见的误区。刘子奇在 BMS 书序中把第 13 章 CAN 通讯的设计要点列成清单,本质上是把 CAN 当作"车规网络节点"来设计:

  • 终端与拓扑:120Ω 终端电阻的位置与分布决定反射与误码,不是玄学;
  • 隔离 CAN 的地参考:隔离后电源、共模范围、ESD 泄放路径不清,会造成"偶发掉线";
  • Bus-off 恢复策略:错误计数、自动恢复、网络管理缺失会让整车"沉默";
  • 报文超时与降级:必须预先定义"什么时候认为 VCU/充电机失联、失联后还允许做什么";
  • EMI 与线束耦合:共模电感、TVS、布局与线束布线要形成整套方案。在汽车电子领域,电池管理系统(BMS)是一个极具矛盾性的存在。它并不显眼(刘子奇)

三、一个真实的 CAN 故障复盘:中断风暴

zzz 分享的 AUTOSAR 休眠复位案例是星球里最完整的 CAN 相关故障链路复盘:休眠过程中 CAN 控制器做模式切换,切换窗口内恰好收到最后一帧报文,RX 中断标志挂起;切换完成后 CAN Driver 状态已变为非激活,ISR 检查状态不满足就提前退出、没有清除挂起标志,于是中断反复触发形成风暴,CPU 被占满后周期任务得不到调度,再次激活时触发 E_OS_LIMIT,最终进入 ErrorHook 并被项目自定义策略复位。

这个案例的普适结论是:OS 报错位置(E_OS_LIMIT)只是故障链路的终点,根因往往在更底层的驱动状态机与外设模式切换时序中。做休眠/唤醒设计时,要重点检查模式切换边界:临界区前是否有未处理中断、切换后是否需要清除挂起标志、是否要先关中断源。最近在项目调试过程中遇到一个比较典型的问题:系统进入休眠流程时(zzz)

四、双机/多板通信:CAN 只是物理层,协议要自己设计

有学员在四足机器狗项目中用 USB 虚拟串口做 MCU 与 RK3588 之间的通信(宇树风格的数据打包),Jack 的回复点出了所有"板间通信"的共同本质:物理层稳定之后,真正的工作是定义帧格式、校验、完整性判断、协议版本匹配、防重复发送,追求吞吐还可以用滑动窗口多次发送统一应答。这套方法论换成 CAN 载体同样成立。老师我目前是在一家公司做四足机器狗 实习一个月了 目前还是在搭平台的阶段(Jack)

多板升级场景下还有一个架构选择:主板升级自己的固件放在主板 Boot 里处理;主板给扩展板刷固件,优先放在主板 App 里处理——Boot 越小越稳定。老师,我想请问一个场景,现在有三块板子,一块主板,两块扩展板(Jack)

五、CAN → ISO-TP → UDS:车载诊断的入门路径

多篇帖子给出了一致的学习顺序:CAN 报文收发 → ISO-TP 多帧传输 → UDS 诊断 → Bootloader 刷写 → CANoe 测试 → AUTOSAR 通信模块零基础如何转行汽车电子?应届生(zzz)

zzz 在 OBD 诊断仪项目的说明中进一步厘清了 OBD 与 UDS 的关系:OBD 解决"标准诊断数据的通用访问"(Mode 01/03/04/09 统一了 PID),UDS(ISO 14229)解决"具体 ECU 的开发、测试与刷写"(0x10 会话、0x27 安全访问、0x22 读 DID、0x34/36/37 刷写)。通用诊断仪以 OBD 为主、只扩展少量 0x22 服务,是因为只有"有真实需求、有明确接口、能实车验证"的功能才该进产品OBD诊断仪项目为什么以OBD(zzz)

甚至"用 CAN 只刷程序"也是可行的入门项目:板子上只有 CAN 口时,思路就是把 CAN 当作传输载体,走"学习 OTA → 在 OTA 框架上换传输层"的路径。这个你可以先学习OTA,然后O(Jack)

六、向机器人与新能源的延伸

来源笔记